#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6,maxe=1e6;
struct linkList {
    typedef struct {int u,v,w,next;} edge;
    edge e[maxe];
    int h[maxn],edge_cnt=0;
    linkList(){	//构造函数
        edge_cnt=0;
        memset(h,-1,sizeof(h));
    }
    //遍历点u 周围点
    template<typename U>
    void for_each(int u,U func){
        for(int i = h[u] ; i !=-1;i = e[i].next)
            func(e[i].u,e[i].v,e[i].w); //u v w
    }
    void add(int u,int v,int w=0){
        e[edge_cnt] = {u,v,w,h[u]};
        h[u] = edge_cnt++;
    }
    void add2(int u,int v,int w=0){
        add(u,v,w);
        add(v,u,w);
    }
    edge& operator[](int i){
        return e[i];
    }
    void sort(){
        std::sort(e,e+edge_cnt,[](edge &e1,edge& e2){ return e1.w < e2.w; });
    }
} e;

template<std::size_t size>
struct bipartite_graph_color 
{
public:
    bipartite_graph_color(linkList & e) : e{e} 
    {
        //-1表示还没有颜色，就是没有访问过
        memset(color,-1,sizeof(color));
    }
    bool work(){ return dfs(1,1); }
private:
    //u上一个点，pre上一个点的颜色，颜色只能是0 or 1
    bool dfs(int u,int pre){
        color[u] = pre ^ 1;
        for(int i = e.h[u]; ~i ; i = e[i].next){
            int v = e[i].v;
            if( color[v] == -1){
                if( !dfs(v,color[u]) ) 
                    return false;
            }
            else if(color[v] == color[u])
                return false;
        }
        return true;
    }

    linkList & e;
    int color[size];
};

int main()
{
    int n,m;
    cin >> n>> m;
    for(int i=1;i<=m;i++){
        int u,v;
        cin >> u >>v;
        e.add2(u,v);
    }
    bipartite_graph_color<100> bg(e);
    cout << "is bipartite_graph : " << bg.work() << endl;
    return 0;
}